home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 52 / Amiga Format AFCD52 (Issue 136, May 2000).iso / -screenplay- / shareware / warpquake / warpquakesrc / sv_main.c < prev    next >
C/C++ Source or Header  |  2000-02-29  |  29KB  |  1,201 lines

  1. /*
  2. Copyright (C) 1996-1997 Id Software, Inc.
  3.  
  4. This program is free software; you can redistribute it and/or
  5. modify it under the terms of the GNU General Public License
  6. as published by the Free Software Foundation; either version 2
  7. of the License, or (at your option) any later version.
  8.  
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
  12.  
  13. See the GNU General Public License for more details.
  14.  
  15. You should have received a copy of the GNU General Public License
  16. along with this program; if not, write to the Free Software
  17. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  18.  
  19. */
  20. // sv_main.c -- server main program
  21.  
  22. #include "quakedef.h"
  23.  
  24. server_t        sv;
  25. server_static_t    svs;
  26.  
  27. char    localmodels[MAX_MODELS][5];            // inline model names for precache
  28.  
  29. //============================================================================
  30.  
  31. /*
  32. ===============
  33. SV_Init
  34. ===============
  35. */
  36. void SV_Init (void)
  37. {
  38.     int        i;
  39.     extern    cvar_t    sv_maxvelocity;
  40.     extern    cvar_t    sv_gravity;
  41.     extern    cvar_t    sv_nostep;
  42.     extern    cvar_t    sv_friction;
  43.     extern    cvar_t    sv_edgefriction;
  44.     extern    cvar_t    sv_stopspeed;
  45.     extern    cvar_t    sv_maxspeed;
  46.     extern    cvar_t    sv_accelerate;
  47.     extern    cvar_t    sv_idealpitchscale;
  48.     extern    cvar_t    sv_aim;
  49.  
  50.     Cvar_RegisterVariable (&sv_maxvelocity);
  51.     Cvar_RegisterVariable (&sv_gravity);
  52.     Cvar_RegisterVariable (&sv_friction);
  53.     Cvar_RegisterVariable (&sv_edgefriction);
  54.     Cvar_RegisterVariable (&sv_stopspeed);
  55.     Cvar_RegisterVariable (&sv_maxspeed);
  56.     Cvar_RegisterVariable (&sv_accelerate);
  57.     Cvar_RegisterVariable (&sv_idealpitchscale);
  58.     Cvar_RegisterVariable (&sv_aim);
  59.     Cvar_RegisterVariable (&sv_nostep);
  60.  
  61.     for (i=0 ; i<MAX_MODELS ; i++)
  62.         sprintf (localmodels[i], "*%i", i);
  63. }
  64.  
  65. /*
  66. =============================================================================
  67.  
  68. EVENT MESSAGES
  69.  
  70. =============================================================================
  71. */
  72.  
  73. /*  
  74. ==================
  75. SV_StartParticle
  76.  
  77. Make sure the event gets sent to all clients
  78. ==================
  79. */
  80. void SV_StartParticle (vec3_t org, vec3_t dir, int color, int count)
  81. {
  82.     int        i, v;
  83.  
  84.     if (sv.datagram.cursize > MAX_DATAGRAM-16)
  85.         return;    
  86.     MSG_WriteByte (&sv.datagram, svc_particle);
  87.     MSG_WriteCoord (&sv.datagram, org[0]);
  88.     MSG_WriteCoord (&sv.datagram, org[1]);
  89.     MSG_WriteCoord (&sv.datagram, org[2]);
  90.     for (i=0 ; i<3 ; i++)
  91.     {
  92.         v = dir[i]*16;
  93.         if (v > 127)
  94.             v = 127;
  95.         else if (v < -128)
  96.             v = -128;
  97.         MSG_WriteChar (&sv.datagram, v);
  98.     }
  99.     MSG_WriteByte (&sv.datagram, count);
  100.     MSG_WriteByte (&sv.datagram, color);
  101. }           
  102.  
  103. /*  
  104. ==================
  105. SV_StartSound
  106.  
  107. Each entity can have eight independant sound sources, like voice,
  108. weapon, feet, etc.
  109.  
  110. Channel 0 is an auto-allocate channel, the others override anything
  111. allready running on that entity/channel pair.
  112.  
  113. An attenuation of 0 will play full volume everywhere in the level.
  114. Larger attenuations will drop off.  (max 4 attenuation)
  115.  
  116. ==================
  117. */  
  118. void SV_StartSound (edict_t *entity, int channel, char *sample, int volume,
  119.     float attenuation)
  120. {       
  121.     int         sound_num;
  122.     int field_mask;
  123.     int            i;
  124.     int            ent;
  125.     
  126.     if (volume < 0 || volume > 255)
  127.         Sys_Error ("SV_StartSound: volume = %i", volume);
  128.  
  129.     if (attenuation < 0 || attenuation > 4)
  130.         Sys_Error ("SV_StartSound: attenuation = %f", attenuation);
  131.  
  132.     if (channel < 0 || channel > 7)
  133.         Sys_Error ("SV_StartSound: channel = %i", channel);
  134.  
  135.     if (sv.datagram.cursize > MAX_DATAGRAM-16)
  136.         return;    
  137.  
  138. // find precache number for sound
  139.     for (sound_num=1 ; sound_num<MAX_SOUNDS
  140.         && sv.sound_precache[sound_num] ; sound_num++)
  141.         if (!strcmp(sample, sv.sound_precache[sound_num]))
  142.             break;
  143.     
  144.     if ( sound_num == MAX_SOUNDS || !sv.sound_precache[sound_num] )
  145.     {
  146.         Con_Printf ("SV_StartSound: %s not precacheed\n", sample);
  147.         return;
  148.     }
  149.     
  150.     ent = NUM_FOR_EDICT(entity);
  151.  
  152.     channel = (ent<<3) | channel;
  153.  
  154.     field_mask = 0;
  155.     if (volume != DEFAULT_SOUND_PACKET_VOLUME)
  156.         field_mask |= SND_VOLUME;
  157.     if (attenuation != DEFAULT_SOUND_PACKET_ATTENUATION)
  158.         field_mask |= SND_ATTENUATION;
  159.  
  160. // directed messages go only to the entity the are targeted on
  161.     MSG_WriteByte (&sv.datagram, svc_sound);
  162.     MSG_WriteByte (&sv.datagram, field_mask);
  163.     if (field_mask & SND_VOLUME)
  164.         MSG_WriteByte (&sv.datagram, volume);
  165.     if (field_mask & SND_ATTENUATION)
  166.         MSG_WriteByte (&sv.datagram, attenuation*64);
  167.     MSG_WriteShort (&sv.datagram, channel);
  168.     MSG_WriteByte (&sv.datagram, sound_num);
  169.     for (i=0 ; i<3 ; i++)
  170.         MSG_WriteCoord (&sv.datagram, entity->v.origin[i]+0.5*(entity->v.mins[i]+entity->v.maxs[i]));
  171. }           
  172.  
  173. /*
  174. ==============================================================================
  175.  
  176. CLIENT SPAWNING
  177.  
  178. ==============================================================================
  179. */
  180.  
  181. /*
  182. ================
  183. SV_SendServerinfo
  184.  
  185. Sends the first message from the server to a connected client.
  186. This will be sent on the initial connection and upon each server load.
  187. ================
  188. */
  189. void SV_SendServerinfo (client_t *client)
  190. {
  191.     char            **s;
  192.     char            message[2048];
  193.  
  194.     MSG_WriteByte (&client->message, svc_print);
  195.     sprintf (message, "%c\nVERSION %4.2f SERVER (%i CRC)", 2, VERSION, pr_crc);
  196.     MSG_WriteString (&client->message,message);
  197.  
  198.     MSG_WriteByte (&client->message, svc_serverinfo);
  199.     MSG_WriteLong (&client->message, PROTOCOL_VERSION);
  200.     MSG_WriteByte (&client->message, svs.maxclients);
  201.  
  202.     if (!coop.value && deathmatch.value)
  203.         MSG_WriteByte (&client->message, GAME_DEATHMATCH);
  204.     else
  205.         MSG_WriteByte (&client->message, GAME_COOP);
  206.  
  207.     sprintf (message, pr_strings+sv.edicts->v.message);
  208.  
  209.     MSG_WriteString (&client->message,message);
  210.  
  211.     for (s = sv.model_precache+1 ; *s ; s++)
  212.         MSG_WriteString (&client->message, *s);
  213.     MSG_WriteByte (&client->message, 0);
  214.  
  215.     for (s = sv.sound_precache+1 ; *s ; s++)
  216.         MSG_WriteString (&client->message, *s);
  217.     MSG_WriteByte (&client->message, 0);
  218.  
  219. // send music
  220.     MSG_WriteByte (&client->message, svc_cdtrack);
  221.     MSG_WriteByte (&client->message, sv.edicts->v.sounds);
  222.     MSG_WriteByte (&client->message, sv.edicts->v.sounds);
  223.  
  224. // set view    
  225.     MSG_WriteByte (&client->message, svc_setview);
  226.     MSG_WriteShort (&client->message, NUM_FOR_EDICT(client->edict));
  227.  
  228.     MSG_WriteByte (&client->message, svc_signonnum);
  229.     MSG_WriteByte (&client->message, 1);
  230.  
  231.     client->sendsignon = true;
  232.     client->spawned = false;        // need prespawn, spawn, etc
  233. }
  234.  
  235. /*
  236. ================
  237. SV_ConnectClient
  238.  
  239. Initializes a client_t for a new net connection.  This will only be called
  240. once for a player each game, not once for each level change.
  241. ================
  242. */
  243. void SV_ConnectClient (int clientnum)
  244. {
  245.     edict_t            *ent;
  246.     client_t        *client;
  247.     int                edictnum;
  248.     struct qsocket_s *netconnection;
  249.     int                i;
  250.     float            spawn_parms[NUM_SPAWN_PARMS];
  251.  
  252.     client = svs.clients + clientnum;
  253.  
  254.     Con_DPrintf ("Client %s connected\n", client->netconnection->address);
  255.  
  256.     edictnum = clientnum+1;
  257.  
  258.     ent = EDICT_NUM(edictnum);
  259.     
  260. // set up the client_t
  261.     netconnection = client->netconnection;
  262.     
  263.     if (sv.loadgame)
  264.         memcpy (spawn_parms, client->spawn_parms, sizeof(spawn_parms));
  265.     memset (client, 0, sizeof(*client));
  266.     client->netconnection = netconnection;
  267.  
  268.     strcpy (client->name, "unconnected");
  269.     client->active = true;
  270.     client->spawned = false;
  271.     client->edict = ent;
  272.     client->message.data = client->msgbuf;
  273.     client->message.maxsize = sizeof(client->msgbuf);
  274.     client->message.allowoverflow = true;        // we can catch it
  275.  
  276. #ifdef IDGODS
  277.     client->privileged = IsID(&client->netconnection->addr);
  278. #else    
  279.     client->privileged = false;                
  280. #endif
  281.  
  282.     if (sv.loadgame)
  283.         memcpy (client->spawn_parms, spawn_parms, sizeof(spawn_parms));
  284.     else
  285.     {
  286.     // call the progs to get default spawn parms for the new client
  287.         PR_ExecuteProgram (pr_global_struct->SetNewParms);
  288.         for (i=0 ; i<NUM_SPAWN_PARMS ; i++)
  289.             client->spawn_parms[i] = (&pr_global_struct->parm1)[i];
  290.     }
  291.  
  292.     SV_SendServerinfo (client);
  293. }
  294.  
  295.  
  296. /*
  297. ===================
  298. SV_CheckForNewClients
  299.  
  300. ===================
  301. */
  302. void SV_CheckForNewClients (void)
  303. {
  304.     struct qsocket_s    *ret;
  305.     int                i;
  306.         
  307. //
  308. // check for new connections
  309. //
  310.     while (1)
  311.     {
  312.         ret = NET_CheckNewConnections ();
  313.         if (!ret)
  314.             break;
  315.  
  316.     // 
  317.     // init a new client structure
  318.     //    
  319.         for (i=0 ; i<svs.maxclients ; i++)
  320.             if (!svs.clients[i].active)
  321.                 break;
  322.         if (i == svs.maxclients)
  323.             Sys_Error ("Host_CheckForNewClients: no free clients");
  324.         
  325.         svs.clients[i].netconnection = ret;
  326.         SV_ConnectClient (i);    
  327.     
  328.         net_activeconnections++;
  329.     }
  330. }
  331.  
  332.  
  333.  
  334. /*
  335. ===============================================================================
  336.  
  337. FRAME UPDATES
  338.  
  339. ===============================================================================
  340. */
  341.  
  342. /*
  343. ==================
  344. SV_ClearDatagram
  345.  
  346. ==================
  347. */
  348. void SV_ClearDatagram (void)
  349. {
  350.     SZ_Clear (&sv.datagram);
  351. }
  352.  
  353. /*
  354. =============================================================================
  355.  
  356. The PVS must include a small area around the client to allow head bobbing
  357. or other small motion on the client side.  Otherwise, a bob might cause an
  358. entity that should be visible to not show up, especially when the bob
  359. crosses a waterline.
  360.  
  361. =============================================================================
  362. */
  363.  
  364. int        fatbytes;
  365. byte    fatpvs[MAX_MAP_LEAFS/8];
  366.  
  367. void SV_AddToFatPVS (vec3_t org, mnode_t *node)
  368. {
  369.     int        i;
  370.     byte    *pvs;
  371.     mplane_t    *plane;
  372.     float    d;
  373.  
  374.     while (1)
  375.     {
  376.     // if this is a leaf, accumulate the pvs bits
  377.         if (node->contents < 0)
  378.         {
  379.             if (node->contents != CONTENTS_SOLID)
  380.             {
  381.                 pvs = Mod_LeafPVS ( (mleaf_t *)node, sv.worldmodel);
  382.                 for (i=0 ; i<fatbytes ; i++)
  383.                     fatpvs[i] |= pvs[i];
  384.             }
  385.             return;
  386.         }
  387.     
  388.         plane = node->plane;
  389.         d = DotProduct (org, plane->normal) - plane->dist;
  390.         if (d > 8)
  391.             node = node->children[0];
  392.         else if (d < -8)
  393.             node = node->children[1];
  394.         else
  395.         {    // go down both
  396.             SV_AddToFatPVS (org, node->children[0]);
  397.             node = node->children[1];
  398.         }
  399.     }
  400. }
  401.  
  402. /*
  403. =============
  404. SV_FatPVS
  405.  
  406. Calculates a PVS that is the inclusive or of all leafs within 8 pixels of the
  407. given point.
  408. =============
  409. */
  410. byte *SV_FatPVS (vec3_t org)
  411. {
  412.     fatbytes = (sv.worldmodel->numleafs+31)>>3;
  413.     Q_memset (fatpvs, 0, fatbytes);
  414.     SV_AddToFatPVS (org, sv.worldmodel->nodes);
  415.     return fatpvs;
  416. }
  417.  
  418. //=============================================================================
  419.  
  420.  
  421. /*
  422. =============
  423. SV_WriteEntitiesToClient
  424.  
  425. =============
  426. */
  427. void SV_WriteEntitiesToClient (edict_t    *clent, sizebuf_t *msg)
  428. {
  429.     int        e, i;
  430.     int        bits;
  431.     byte    *pvs;
  432.     vec3_t    org;
  433.     float    miss;
  434.     edict_t    *ent;
  435.  
  436. // find the client's PVS
  437.     VectorAdd (clent->v.origin, clent->v.view_ofs, org);
  438.     pvs = SV_FatPVS (org);
  439.  
  440. // send over all entities (excpet the client) that touch the pvs
  441.     ent = NEXT_EDICT(sv.edicts);
  442.     for (e=1 ; e<sv.num_edicts ; e++, ent = NEXT_EDICT(ent))
  443.     {
  444. #ifdef QUAKE2
  445.         // don't send if flagged for NODRAW and there are no lighting effects
  446.         if (ent->v.effects == EF_NODRAW)
  447.             continue;
  448. #endif
  449.  
  450. // ignore if not touching a PV leaf
  451.         if (ent != clent)    // clent is ALLWAYS sent
  452.         {
  453. // ignore ents without visible models
  454.             if (!ent->v.modelindex || !pr_strings[ent->v.model])
  455.                 continue;
  456.  
  457.             for (i=0 ; i < ent->num_leafs ; i++)
  458.                 if (pvs[ent->leafnums[i] >> 3] & (1 << (ent->leafnums[i]&7) ))
  459.                     break;
  460.                 
  461.             if (i == ent->num_leafs)
  462.                 continue;        // not visible
  463.         }
  464.  
  465.         if (msg->maxsize - msg->cursize < 16)
  466.         {
  467.             Con_Printf ("packet overflow\n");
  468.             return;
  469.         }
  470.  
  471. // send an update
  472.         bits = 0;
  473.         
  474.         for (i=0 ; i<3 ; i++)
  475.         {
  476.             miss = ent->v.origin[i] - ent->baseline.origin[i];
  477.             if ( miss < -0.1 || miss > 0.1 )
  478.                 bits |= U_ORIGIN1<<i;
  479.         }
  480.  
  481.         if ( ent->v.angles[0] != ent->baseline.angles[0] )
  482.             bits |= U_ANGLE1;
  483.             
  484.         if ( ent->v.angles[1] != ent->baseline.angles[1] )
  485.             bits |= U_ANGLE2;
  486.             
  487.         if ( ent->v.angles[2] != ent->baseline.angles[2] )
  488.             bits |= U_ANGLE3;
  489.             
  490.         if (ent->v.movetype == MOVETYPE_STEP)
  491.             bits |= U_NOLERP;    // don't mess up the step animation
  492.     
  493.         if (ent->baseline.colormap != ent->v.colormap)
  494.             bits |= U_COLORMAP;
  495.             
  496.         if (ent->baseline.skin != ent->v.skin)
  497.             bits |= U_SKIN;
  498.             
  499.         if (ent->baseline.frame != ent->v.frame)
  500.             bits |= U_FRAME;
  501.         
  502.         if (ent->baseline.effects != ent->v.effects)
  503.             bits |= U_EFFECTS;
  504.         
  505.         if (ent->baseline.modelindex != ent->v.modelindex)
  506.             bits |= U_MODEL;
  507.  
  508.         if (e >= 256)
  509.             bits |= U_LONGENTITY;
  510.             
  511.         if (bits >= 256)
  512.             bits |= U_MOREBITS;
  513.  
  514.     //
  515.     // write the message
  516.     //
  517.         MSG_WriteByte (msg,bits | U_SIGNAL);
  518.         
  519.         if (bits & U_MOREBITS)
  520.             MSG_WriteByte (msg, bits>>8);
  521.         if (bits & U_LONGENTITY)
  522.             MSG_WriteShort (msg,e);
  523.         else
  524.             MSG_WriteByte (msg,e);
  525.  
  526.         if (bits & U_MODEL)
  527.             MSG_WriteByte (msg,    ent->v.modelindex);
  528.         if (bits & U_FRAME)
  529.             MSG_WriteByte (msg, ent->v.frame);
  530.         if (bits & U_COLORMAP)
  531.             MSG_WriteByte (msg, ent->v.colormap);
  532.         if (bits & U_SKIN)
  533.             MSG_WriteByte (msg, ent->v.skin);
  534.         if (bits & U_EFFECTS)
  535.             MSG_WriteByte (msg, ent->v.effects);
  536.         if (bits & U_ORIGIN1)
  537.             MSG_WriteCoord (msg, ent->v.origin[0]);        
  538.         if (bits & U_ANGLE1)
  539.             MSG_WriteAngle(msg, ent->v.angles[0]);
  540.         if (bits & U_ORIGIN2)
  541.             MSG_WriteCoord (msg, ent->v.origin[1]);
  542.         if (bits & U_ANGLE2)
  543.             MSG_WriteAngle(msg, ent->v.angles[1]);
  544.         if (bits & U_ORIGIN3)
  545.             MSG_WriteCoord (msg, ent->v.origin[2]);
  546.         if (bits & U_ANGLE3)
  547.             MSG_WriteAngle(msg, ent->v.angles[2]);
  548.     }
  549. }
  550.  
  551. /*
  552. =============
  553. SV_CleanupEnts
  554.  
  555. =============
  556. */
  557. void SV_CleanupEnts (void)
  558. {
  559.     int        e;
  560.     edict_t    *ent;
  561.     
  562.     ent = NEXT_EDICT(sv.edicts);
  563.     for (e=1 ; e<sv.num_edicts ; e++, ent = NEXT_EDICT(ent))
  564.     {
  565.         ent->v.effects = (int)ent->v.effects & ~EF_MUZZLEFLASH;
  566.     }
  567.  
  568. }
  569.  
  570. /*
  571. ==================
  572. SV_WriteClientdataToMessage
  573.  
  574. ==================
  575. */
  576. void SV_WriteClientdataToMessage (edict_t *ent, sizebuf_t *msg)
  577. {
  578.     int        bits;
  579.     int        i;
  580.     edict_t    *other;
  581.     int        items;
  582. #ifndef QUAKE2
  583.     eval_t    *val;
  584. #endif
  585.  
  586. //
  587. // send a damage message
  588. //
  589.     if (ent->v.dmg_take || ent->v.dmg_save)
  590.     {
  591.         other = PROG_TO_EDICT(ent->v.dmg_inflictor);
  592.         MSG_WriteByte (msg, svc_damage);
  593.         MSG_WriteByte (msg, ent->v.dmg_save);
  594.         MSG_WriteByte (msg, ent->v.dmg_take);
  595.         for (i=0 ; i<3 ; i++)
  596.             MSG_WriteCoord (msg, other->v.origin[i] + 0.5*(other->v.mins[i] + other->v.maxs[i]));
  597.     
  598.         ent->v.dmg_take = 0;
  599.         ent->v.dmg_save = 0;
  600.     }
  601.  
  602. //
  603. // send the current viewpos offset from the view entity
  604. //
  605.     SV_SetIdealPitch ();        // how much to look up / down ideally
  606.  
  607. // a fixangle might get lost in a dropped packet.  Oh well.
  608.     if ( ent->v.fixangle )
  609.     {
  610.         MSG_WriteByte (msg, svc_setangle);
  611.         for (i=0 ; i < 3 ; i++)
  612.             MSG_WriteAngle (msg, ent->v.angles[i] );
  613.         ent->v.fixangle = 0;
  614.     }
  615.  
  616.     bits = 0;
  617.     
  618.     if (ent->v.view_ofs[2] != DEFAULT_VIEWHEIGHT)
  619.         bits |= SU_VIEWHEIGHT;
  620.         
  621.     if (ent->v.idealpitch)
  622.         bits |= SU_IDEALPITCH;
  623.  
  624. // stuff the sigil bits into the high bits of items for sbar, or else
  625. // mix in items2
  626. #ifdef QUAKE2
  627.     items = (int)ent->v.items | ((int)ent->v.items2 << 23);
  628. #else
  629.     val = GetEdictFieldValue(ent, "items2");
  630.  
  631.     if (val)
  632.         items = (int)ent->v.items | ((int)val->_float << 23);
  633.     else
  634.         items = (int)ent->v.items | ((int)pr_global_struct->serverflags << 28);
  635. #endif
  636.  
  637.     bits |= SU_ITEMS;
  638.     
  639.     if ( (int)ent->v.flags & FL_ONGROUND)
  640.         bits |= SU_ONGROUND;
  641.     
  642.     if ( ent->v.waterlevel >= 2)
  643.         bits |= SU_INWATER;
  644.     
  645.     for (i=0 ; i<3 ; i++)
  646.     {
  647.         if (ent->v.punchangle[i])
  648.             bits |= (SU_PUNCH1<<i);
  649.         if (ent->v.velocity[i])
  650.             bits |= (SU_VELOCITY1<<i);
  651.     }
  652.     
  653.     if (ent->v.weaponframe)
  654.         bits |= SU_WEAPONFRAME;
  655.  
  656.     if (ent->v.armorvalue)
  657.         bits |= SU_ARMOR;
  658.  
  659. //    if (ent->v.weapon)
  660.         bits |= SU_WEAPON;
  661.  
  662. // send the data
  663.  
  664.     MSG_WriteByte (msg, svc_clientdata);
  665.     MSG_WriteShort (msg, bits);
  666.  
  667.     if (bits & SU_VIEWHEIGHT)
  668.         MSG_WriteChar (msg, ent->v.view_ofs[2]);
  669.  
  670.     if (bits & SU_IDEALPITCH)
  671.         MSG_WriteChar (msg, ent->v.idealpitch);
  672.  
  673.     for (i=0 ; i<3 ; i++)
  674.     {
  675.         if (bits & (SU_PUNCH1<<i))
  676.             MSG_WriteChar (msg, ent->v.punchangle[i]);
  677.         if (bits & (SU_VELOCITY1<<i))
  678.             MSG_WriteChar (msg, ent->v.velocity[i]/16);
  679.     }
  680.  
  681. // [always sent]    if (bits & SU_ITEMS)
  682.     MSG_WriteLong (msg, items);
  683.  
  684.     if (bits & SU_WEAPONFRAME)
  685.         MSG_WriteByte (msg, ent->v.weaponframe);
  686.     if (bits & SU_ARMOR)
  687.         MSG_WriteByte (msg, ent->v.armorvalue);
  688.     if (bits & SU_WEAPON)
  689.         MSG_WriteByte (msg, SV_ModelIndex(pr_strings+ent->v.weaponmodel));
  690.     
  691.     MSG_WriteShort (msg, ent->v.health);
  692.     MSG_WriteByte (msg, ent->v.currentammo);
  693.     MSG_WriteByte (msg, ent->v.ammo_shells);
  694.     MSG_WriteByte (msg, ent->v.ammo_nails);
  695.     MSG_WriteByte (msg, ent->v.ammo_rockets);
  696.     MSG_WriteByte (msg, ent->v.ammo_cells);
  697.  
  698.     if (standard_quake)
  699.     {
  700.         MSG_WriteByte (msg, ent->v.weapon);
  701.     }
  702.     else
  703.     {
  704.         for(i=0;i<32;i++)
  705.         {
  706.             if ( ((int)ent->v.weapon) & (1<<i) )
  707.             {
  708.                 MSG_WriteByte (msg, i);
  709.                 break;
  710.             }
  711.         }
  712.     }
  713. }
  714.  
  715. /*
  716. =======================
  717. SV_SendClientDatagram
  718. =======================
  719. */
  720. qboolean SV_SendClientDatagram (client_t *client)
  721. {
  722.     byte        buf[MAX_DATAGRAM];
  723.     sizebuf_t    msg;
  724.     
  725.     msg.data = buf;
  726.     msg.maxsize = sizeof(buf);
  727.     msg.cursize = 0;
  728.  
  729.     MSG_WriteByte (&msg, svc_time);
  730.     MSG_WriteFloat (&msg, sv.time);
  731.  
  732. // add the client specific data to the datagram
  733.     SV_WriteClientdataToMessage (client->edict, &msg);
  734.  
  735.     SV_WriteEntitiesToClient (client->edict, &msg);
  736.  
  737. // copy the server datagram if there is space
  738.     if (msg.cursize + sv.datagram.cursize < msg.maxsize)
  739.         SZ_Write (&msg, sv.datagram.data, sv.datagram.cursize);
  740.  
  741. // send the datagram
  742.     if (NET_SendUnreliableMessage (client->netconnection, &msg) == -1)
  743.     {
  744.         SV_DropClient (true);// if the message couldn't send, kick off
  745.         return false;
  746.     }
  747.     
  748.     return true;
  749. }
  750.  
  751. /*
  752. =======================
  753. SV_UpdateToReliableMessages
  754. =======================
  755. */
  756. void SV_UpdateToReliableMessages (void)
  757. {
  758.     int            i, j;
  759.     client_t *client;
  760.  
  761. // check for changes to be sent over the reliable streams
  762.     for (i=0, host_client = svs.clients ; i<svs.maxclients ; i++, host_client++)
  763.     {
  764.         if (host_client->old_frags != host_client->edict->v.frags)
  765.         {
  766.             for (j=0, client = svs.clients ; j<svs.maxclients ; j++, client++)
  767.             {
  768.                 if (!client->active)
  769.                     continue;
  770.                 MSG_WriteByte (&client->message, svc_updatefrags);
  771.                 MSG_WriteByte (&client->message, i);
  772.                 MSG_WriteShort (&client->message, host_client->edict->v.frags);
  773.             }
  774.  
  775.             host_client->old_frags = host_client->edict->v.frags;
  776.         }
  777.     }
  778.     
  779.     for (j=0, client = svs.clients ; j<svs.maxclients ; j++, client++)
  780.     {
  781.         if (!client->active)
  782.             continue;
  783.         SZ_Write (&client->message, sv.reliable_datagram.data, sv.reliable_datagram.cursize);
  784.     }
  785.  
  786.     SZ_Clear (&sv.reliable_datagram);
  787. }
  788.  
  789.  
  790. /*
  791. =======================
  792. SV_SendNop
  793.  
  794. Send a nop message without trashing or sending the accumulated client
  795. message buffer
  796. =======================
  797. */
  798. void SV_SendNop (client_t *client)
  799. {
  800.     sizebuf_t    msg;
  801.     byte        buf[4];
  802.     
  803.     msg.data = buf;
  804.     msg.maxsize = sizeof(buf);
  805.     msg.cursize = 0;
  806.  
  807.     MSG_WriteChar (&msg, svc_nop);
  808.  
  809.     if (NET_SendUnreliableMessage (client->netconnection, &msg) == -1)
  810.         SV_DropClient (true);    // if the message couldn't send, kick off
  811.     client->last_message = realtime;
  812. }
  813.  
  814. /*
  815. =======================
  816. SV_SendClientMessages
  817. =======================
  818. */
  819. void SV_SendClientMessages (void)
  820. {
  821.     int            i;
  822.     
  823. // update frags, names, etc
  824.     SV_UpdateToReliableMessages ();
  825.  
  826. // build individual updates
  827.     for (i=0, host_client = svs.clients ; i<svs.maxclients ; i++, host_client++)
  828.     {
  829.         if (!host_client->active)
  830.             continue;
  831.  
  832.         if (host_client->spawned)
  833.         {
  834.             if (!SV_SendClientDatagram (host_client))
  835.                 continue;
  836.         }
  837.         else
  838.         {
  839.         // the player isn't totally in the game yet
  840.         // send small keepalive messages if too much time has passed
  841.         // send a full message when the next signon stage has been requested
  842.         // some other message data (name changes, etc) may accumulate 
  843.         // between signon stages
  844.             if (!host_client->sendsignon)
  845.             {
  846.                 if (realtime - host_client->last_message > 5)
  847.                     SV_SendNop (host_client);
  848.                 continue;    // don't send out non-signon messages
  849.             }
  850.         }
  851.  
  852.         // check for an overflowed message.  Should only happen
  853.         // on a very fucked up connection that backs up a lot, then
  854.         // changes level
  855.         if (host_client->message.overflowed)
  856.         {
  857.             SV_DropClient (true);
  858.             host_client->message.overflowed = false;
  859.             continue;
  860.         }
  861.             
  862.         if (host_client->message.cursize || host_client->dropasap)
  863.         {
  864.             if (!NET_CanSendMessage (host_client->netconnection))
  865.             {
  866. //                I_Printf ("can't write\n");
  867.                 continue;
  868.             }
  869.  
  870.             if (host_client->dropasap)
  871.                 SV_DropClient (false);    // went to another level
  872.             else
  873.             {
  874.                 if (NET_SendMessage (host_client->netconnection
  875.                 , &host_client->message) == -1)
  876.                     SV_DropClient (true);    // if the message couldn't send, kick off
  877.                 SZ_Clear (&host_client->message);
  878.                 host_client->last_message = realtime;
  879.                 host_client->sendsignon = false;
  880.             }
  881.         }
  882.     }
  883.     
  884.     
  885. // clear muzzle flashes
  886.     SV_CleanupEnts ();
  887. }
  888.  
  889.  
  890. /*
  891. ==============================================================================
  892.  
  893. SERVER SPAWNING
  894.  
  895. ==============================================================================
  896. */
  897.  
  898. /*
  899. ================
  900. SV_ModelIndex
  901.  
  902. ================
  903. */
  904. int SV_ModelIndex (char *name)
  905. {
  906.     int        i;
  907.     
  908.     if (!name || !name[0])
  909.         return 0;
  910.  
  911.     for (i=0 ; i<MAX_MODELS && sv.model_precache[i] ; i++)
  912.         if (!strcmp(sv.model_precache[i], name))
  913.             return i;
  914.     if (i==MAX_MODELS || !sv.model_precache[i])
  915.         Sys_Error ("SV_ModelIndex: model %s not precached", name);
  916.     return i;
  917. }
  918.  
  919. /*
  920. ================
  921. SV_CreateBaseline
  922.  
  923. ================
  924. */
  925. void SV_CreateBaseline (void)
  926. {
  927.     int            i;
  928.     edict_t            *svent;
  929.     int                entnum;    
  930.         
  931.     for (entnum = 0; entnum < sv.num_edicts ; entnum++)
  932.     {
  933.     // get the current server version
  934.         svent = EDICT_NUM(entnum);
  935.         if (svent->free)
  936.             continue;
  937.         if (entnum > svs.maxclients && !svent->v.modelindex)
  938.             continue;
  939.  
  940.     //
  941.     // create entity baseline
  942.     //
  943.         VectorCopy (svent->v.origin, svent->baseline.origin);
  944.         VectorCopy (svent->v.angles, svent->baseline.angles);
  945.         svent->baseline.frame = svent->v.frame;
  946.         svent->baseline.skin = svent->v.skin;
  947.         if (entnum > 0 && entnum <= svs.maxclients)
  948.         {
  949.             svent->baseline.colormap = entnum;
  950.             svent->baseline.modelindex = SV_ModelIndex("progs/player.mdl");
  951.         }
  952.         else
  953.         {
  954.             svent->baseline.colormap = 0;
  955.             svent->baseline.modelindex =
  956.                 SV_ModelIndex(pr_strings + svent->v.model);
  957.         }
  958.         
  959.     //
  960.     // add to the message
  961.     //
  962.         MSG_WriteByte (&sv.signon,svc_spawnbaseline);        
  963.         MSG_WriteShort (&sv.signon,entnum);
  964.  
  965.         MSG_WriteByte (&sv.signon, svent->baseline.modelindex);
  966.         MSG_WriteByte (&sv.signon, svent->baseline.frame);
  967.         MSG_WriteByte (&sv.signon, svent->baseline.colormap);
  968.         MSG_WriteByte (&sv.signon, svent->baseline.skin);
  969.         for (i=0 ; i<3 ; i++)
  970.         {
  971.             MSG_WriteCoord(&sv.signon, svent->baseline.origin[i]);
  972.             MSG_WriteAngle(&sv.signon, svent->baseline.angles[i]);
  973.         }
  974.     }
  975. }
  976.  
  977.  
  978. /*
  979. ================
  980. SV_SendReconnect
  981.  
  982. Tell all the clients that the server is changing levels
  983. ================
  984. */
  985. void SV_SendReconnect (void)
  986. {
  987.     char    data[128];
  988.     sizebuf_t    msg;
  989.  
  990.     msg.data = data;
  991.     msg.cursize = 0;
  992.     msg.maxsize = sizeof(data);
  993.  
  994.     MSG_WriteChar (&msg, svc_stufftext);
  995.     MSG_WriteString (&msg, "reconnect\n");
  996.     NET_SendToAll (&msg, 5);
  997.     
  998.     if (cls.state != ca_dedicated)
  999. #ifdef QUAKE2
  1000.         Cbuf_InsertText ("reconnect\n");
  1001. #else
  1002.         Cmd_ExecuteString ("reconnect\n", src_command);
  1003. #endif
  1004. }
  1005.  
  1006.  
  1007. /*
  1008. ================
  1009. SV_SaveSpawnparms
  1010.  
  1011. Grabs the current state of each client for saving across the
  1012. transition to another level
  1013. ================
  1014. */
  1015. void SV_SaveSpawnparms (void)
  1016. {
  1017.     int        i, j;
  1018.  
  1019.     svs.serverflags = pr_global_struct->serverflags;
  1020.  
  1021.     for (i=0, host_client = svs.clients ; i<svs.maxclients ; i++, host_client++)
  1022.     {
  1023.         if (!host_client->active)
  1024.             continue;
  1025.  
  1026.     // call the progs to get default spawn parms for the new client
  1027.         pr_global_struct->self = EDICT_TO_PROG(host_client->edict);
  1028.         PR_ExecuteProgram (pr_global_struct->SetChangeParms);
  1029.         for (j=0 ; j<NUM_SPAWN_PARMS ; j++)
  1030.             host_client->spawn_parms[j] = (&pr_global_struct->parm1)[j];
  1031.     }
  1032. }
  1033.  
  1034.  
  1035. /*
  1036. ================
  1037. SV_SpawnServer
  1038.  
  1039. This is called at the start of each level
  1040. ================
  1041. */
  1042. extern float        scr_centertime_off;
  1043.  
  1044. #ifdef QUAKE2
  1045. void SV_SpawnServer (char *server, char *startspot)
  1046. #else
  1047. void SV_SpawnServer (char *server)
  1048. #endif
  1049. {
  1050.     edict_t        *ent;
  1051.     int            i;
  1052.  
  1053.     // let's not have any servers with no name
  1054.     if (hostname.string[0] == 0)
  1055.         Cvar_Set ("hostname", "UNNAMED");
  1056.     scr_centertime_off = 0;
  1057.  
  1058.     Con_DPrintf ("SpawnServer: %s\n",server);
  1059.     svs.changelevel_issued = false;        // now safe to issue another
  1060.  
  1061. //
  1062. // tell all connected clients that we are going to a new level
  1063. //
  1064.     if (sv.active)
  1065.     {
  1066.         SV_SendReconnect ();
  1067.     }
  1068.  
  1069. //
  1070. // make cvars consistant
  1071. //
  1072.     if (coop.value)
  1073.         Cvar_SetValue ("deathmatch", 0);
  1074.     current_skill = (int)(skill.value + 0.5);
  1075.     if (current_skill < 0)
  1076.         current_skill = 0;
  1077.     if (current_skill > 3)
  1078.         current_skill = 3;
  1079.  
  1080.     Cvar_SetValue ("skill", (float)current_skill);
  1081.     
  1082. //
  1083. // set up the new server
  1084. //
  1085.     Host_ClearMemory ();
  1086.  
  1087.     memset (&sv, 0, sizeof(sv));
  1088.  
  1089.     strcpy (sv.name, server);
  1090. #ifdef QUAKE2
  1091.     if (startspot)
  1092.         strcpy(sv.startspot, startspot);
  1093. #endif
  1094.  
  1095. // load progs to get entity field count
  1096.     PR_LoadProgs ();
  1097.  
  1098. // allocate server memory
  1099.     sv.max_edicts = MAX_EDICTS;
  1100.     
  1101.     sv.edicts = Hunk_AllocName (sv.max_edicts*pr_edict_size, "edicts");
  1102.  
  1103.     sv.datagram.maxsize = sizeof(sv.datagram_buf);
  1104.     sv.datagram.cursize = 0;
  1105.     sv.datagram.data = sv.datagram_buf;
  1106.     
  1107.     sv.reliable_datagram.maxsize = sizeof(sv.reliable_datagram_buf);
  1108.     sv.reliable_datagram.cursize = 0;
  1109.     sv.reliable_datagram.data = sv.reliable_datagram_buf;
  1110.     
  1111.     sv.signon.maxsize = sizeof(sv.signon_buf);
  1112.     sv.signon.cursize = 0;
  1113.     sv.signon.data = sv.signon_buf;
  1114.     
  1115. // leave slots at start for clients only
  1116.     sv.num_edicts = svs.maxclients+1;
  1117.     for (i=0 ; i<svs.maxclients ; i++)
  1118.     {
  1119.         ent = EDICT_NUM(i+1);
  1120.         svs.clients[i].edict = ent;
  1121.     }
  1122.     
  1123.     sv.state = ss_loading;
  1124.     sv.paused = false;
  1125.  
  1126.     sv.time = 1.0;
  1127.     
  1128.     strcpy (sv.name, server);
  1129.     sprintf (sv.modelname,"maps/%s.bsp", server);
  1130.     sv.worldmodel = Mod_ForName (sv.modelname, false);
  1131.     if (!sv.worldmodel)
  1132.     {
  1133.         Con_Printf ("Couldn't spawn server %s\n", sv.modelname);
  1134.         sv.active = false;
  1135.         return;
  1136.     }
  1137.     sv.models[1] = sv.worldmodel;
  1138.     
  1139. //
  1140. // clear world interaction links
  1141. //
  1142.     SV_ClearWorld ();
  1143.     
  1144.     sv.sound_precache[0] = pr_strings;
  1145.  
  1146.     sv.model_precache[0] = pr_strings;
  1147.     sv.model_precache[1] = sv.modelname;
  1148.     for (i=1 ; i<sv.worldmodel->numsubmodels ; i++)
  1149.     {
  1150.         sv.model_precache[1+i] = localmodels[i];
  1151.         sv.models[i+1] = Mod_ForName (localmodels[i], false);
  1152.     }
  1153.  
  1154. //
  1155. // load the rest of the entities
  1156. //    
  1157.     ent = EDICT_NUM(0);
  1158.     memset (&ent->v, 0, progs->entityfields * 4);
  1159.     ent->free = false;
  1160.     ent->v.model = sv.worldmodel->name - pr_strings;
  1161.     ent->v.modelindex = 1;        // world model
  1162.     ent->v.solid = SOLID_BSP;
  1163.     ent->v.movetype = MOVETYPE_PUSH;
  1164.  
  1165.     if (coop.value)
  1166.         pr_global_struct->coop = coop.value;
  1167.     else
  1168.         pr_global_struct->deathmatch = deathmatch.value;
  1169.  
  1170.     pr_global_struct->mapname = sv.name - pr_strings;
  1171. #ifdef QUAKE2
  1172.     pr_global_struct->startspot = sv.startspot - pr_strings;
  1173. #endif
  1174.  
  1175. // serverflags are for cross level information (sigils)
  1176.     pr_global_struct->serverflags = svs.serverflags;
  1177.     
  1178.     ED_LoadFromFile (sv.worldmodel->entities);
  1179.  
  1180.     sv.active = true;
  1181.  
  1182. // all setup is completed, any further precache statements are errors
  1183.     sv.state = ss_active;
  1184.     
  1185. // run two frames to allow everything to settle
  1186.     host_frametime = 0.1;
  1187.     SV_Physics ();
  1188.     SV_Physics ();
  1189.  
  1190. // create a baseline for more efficient communications
  1191.     SV_CreateBaseline ();
  1192.  
  1193. // send serverinfo to all connected clients
  1194.     for (i=0,host_client = svs.clients ; i<svs.maxclients ; i++, host_client++)
  1195.         if (host_client->active)
  1196.             SV_SendServerinfo (host_client);
  1197.     
  1198.     Con_DPrintf ("Server spawned.\n");
  1199. }
  1200.  
  1201.